package com.example.eventreg.security;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.SignatureException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JwtUtil {
    @Value("${jwt.secret}")
    private String secretKey;  // 从配置文件中读取的密钥

    @Value("${jwt.expiration}")
    private long expirationTime;  // 从配置文件中读取的 Token 有效期（毫秒）

    /**
     * 生成 JWT Token。
     * 包含用户 ID 和用户名。
     * @param userId 用户 ID
     * @param username 用户名
     * @return String 生成的 JWT Token
     */
//    public String generateToken(Long userId, String username) {
//        return Jwts.builder()  // 创建 JWT 构建器
//                .setSubject(String.valueOf(userId))  // 设置用户 ID 作为主题
//                .claim("username", username)  // 添加用户名作为自定义 Claims
//                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))  // 设置 Token 过期时间
//                .signWith(SignatureAlgorithm.HS256, secretKey.getBytes())  // 使用 HMAC-SHA256 签名
//                .compact();  // 构建并压缩 Token
//    }
    public String generateTokenS(String userId, String username) {
        username = "S"+username;
        String token =  Jwts.builder()  // 创建 JWT 构建器
                .setSubject(userId)  // 设置用户 ID 作为主题
                .claim("username", username)  // 添加用户名作为自定义 Claims
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))  // 设置 Token 过期时间
                .signWith(SignatureAlgorithm.HS256, secretKey.getBytes())  // 使用 HMAC-SHA256 签名
                .compact();  // 构建并压缩 Token

        System.out.println("generate: "+token);
        return token;
    }
    public String generateTokenO(String userId, String username) {
        username = "O"+username;
        String token =  Jwts.builder()  // 创建 JWT 构建器
                .setSubject(userId)  // 设置用户 ID 作为主题
                .claim("username", username)  // 添加用户名作为自定义 Claims
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))  // 设置 Token 过期时间
                .signWith(SignatureAlgorithm.HS256, secretKey.getBytes())  // 使用 HMAC-SHA256 签名
                .compact();  // 构建并压缩 Token
        System.out.println(token);
        return token;
    }
    public String generateTokenA(String userId) {
        return Jwts.builder()  // 创建 JWT 构建器
                .setSubject(userId)  // 设置用户 ID 作为主题
                .claim("username", "A"+userId)  // 添加用户名作为自定义 Claims
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))  // 设置 Token 过期时间
                .signWith(SignatureAlgorithm.HS256, secretKey.getBytes())  // 使用 HMAC-SHA256 签名
                .compact();  // 构建并压缩 Token
    }

    /**
     * 解析 JWT Token。
     * 提取 Token 的 Claims 部分。
     * @param token JWT Token
     * @return Claims 解析后的 Claims
     * @throws RuntimeException 如果 Token 无效或已过期
     */
    public Claims parseToken(String token) {
        try {
            return Jwts.parser()  // 创建 JWT 解析器
                    .setSigningKey(secretKey.getBytes())  // 设置签名密钥
                    .build()
                    .parseSignedClaims(token)  // 解析 Token
                    .getPayload();  // 提取 Claims 部分
        } catch (ExpiredJwtException e) {
            throw new RuntimeException("Token 已过期", e);  // 捕获 Token 过期异常
        } catch (SignatureException e) {
            throw new RuntimeException("无效的 JWT 签名", e);  // 捕获签名验证失败异常
        } catch (JwtException e) {
            throw new RuntimeException("无效的 JWT Token", e);  // 捕获其他 JWT 异常
        }
    }

    /**
     * 从 Token 中提取用户 ID。
     * @param token JWT Token
     * @return Long 用户 ID
     */
    public String getUserIdFromToken(String token) {
        Claims claims = parseToken(token);  // 解析 Token
        return claims.getSubject();  // 提取用户 ID
    }

    /**
     * 从 Token 中提取用户名。
     * @param token JWT Token
     * @return String 用户名
     */
    //获取用户名
    public String getUsernameFromToken(String token) {
        Claims claims = parseToken(token);  // 解析 Token
        String username = claims.get("username", String.class);
        return username.substring(1);  // 提取用户名
    }
    //获取账号类型
    public String getTypeFromToken(String token) {
        Claims claims = parseToken(token);  // 解析 Token
        String username = claims.get("username", String.class);
        return username.substring(0,1);  // 提取用户名
    }
    public String getFullNameFromToken(String token) {
        Claims claims = parseToken(token);  // 解析 Token
        return claims.get("username", String.class);// 提取用户名
    }
    /**
     * 判断 Token 是否有效。
     * 校验 Token 的签名和有效期。
     * @param token JWT Token
     * @return boolean 是否有效
     */
    public boolean isTokenValid(String token) {
        System.out.println("isTokenValid: "+token);
        try {
            Jwts.parser()  // 创建 JWT 解析器
                    .setSigningKey(secretKey.getBytes())  // 设置签名密钥
                    .build()
                    .parseClaimsJws(token);  // 解析 Token
            System.out.println("true");
            return true;  // 如果解析成功，返回 true
        } catch (ExpiredJwtException e) {
            // Token 已过期
            System.out.println("Token 已过期");
            return false;
        } catch (JwtException e) {
            // 其他 JWT 异常，例如签名无效
            System.out.println("JWT 异常，例如签名无效");
            return false;
        }
    }
}